package sun.superstring.polymorphise3;

public class Test1 {
    public static void main(String[] args) {
        // 目标：认识多态的代码
        // 1、多态的好处1：右边的对象是解耦合的。

        // 正确的类型转换
        Animal a1 = new Tortoise();// 向上转型（隐式）
        a1.run();
        // 强制类型转换
        Tortoise t1 = (Tortoise) a1;  // 向下转型
        t1.shrinkHead(); // 调用子类特有的方法

        System.out.println("============================");
        // 有继承关系就可以强制转换，编译阶段不会报错！！
        // 运行时可能会出现类型转换异常：ClassCastException
//        Animal a2 = new Wolf();  // ===> Animal a1 = new Tortoise();
//        a2.run();
//        // 强制类型转换
//        Tortoise t2 = (Tortoise) a2;// 编译阶段不会报错，但是运行时会报错
//        t2.shrinkHead();

//        if(a1 instanceof Wolf){
//            Wolf w1 = (Wolf) a1;
//            w1.eatSheep();
//        }else if(a1 instanceof Tortoise){
//            Tortoise t11 = (Tortoise) a1;
//            t11.run();
//        }
        System.out.println("============================");

        // 调用独特功能
        Animal w = new Wolf();
        special(w);

        Animal t = new Tortoise();
        special(t);
    }

    // 宠物游戏：所有动物都可以送给这个方法开始跑步
    public static void go(Animal w) {
        System.out.println("开始......");
        w.run();
//        a1.shrinkHead(); // 报错，多态下不能调用子类独有的功能
    }

    public static void special(Animal w) {
        System.out.println("开始......");
        // Java建议：强制类型转换前，应该判断对象的真实类型，再进行强制类型转换
        if(w instanceof Wolf){
            Wolf w1 = (Wolf) w;
            w1.eatSheep();
        }else if(w instanceof Tortoise){
            Tortoise t11 = (Tortoise) w;
            t11.shrinkHead();
        }
    }
}
